برچسب: نویسنده: خنجی تاريخ: سه شنبه 30 آبان 1402 ساعت: 1:20
در نسخه 23c، اوراکل پکیجی را به نام DBMS_SEARCH معرفی کرده است که می تواند با استفاده از زیرساخت ORACLE TEXT و حذف پیچیدگی های آن، امکان جستجو را بر روی Objectهای مختلف فراهم کند. پکیج DBMS_SEARCH با ایجاد ایندکسی از نوع JSON Search Index می تواند قابلیت جستجو را بر روی sourceهای مختلف اعم از Table و View فراهم کند.
برخلاف ایندکسهای متعارف نظیر Btree و Bitmap که بر روی ستونهای یک جدول قابل ایجاد هستند، ایندکسی که از طریق پکیج DBMS_SEARCH ایجاد می شود، می تواند چندین جدول و ویو را به عنوان source بپذیرد و جستجوی همزمان را بر روی این sourceها انجام دهد.
جداولی که به عنوان سورس تعیین می شوند می توانند حاوی ستونهایی با نوع داده number، varchar، CLOB، JSON و … باشند و محدودیتهای بسیاری کمی در این زمینه وجود دارد ضمنا اضافه کردن source به ایندکس به راحتی و صرفا با اجرای یک دستور امکان پذیر است.
توجه! ایندکسهایی که از طریق این پکیج ایجاد می شوند، بروزرسانی آنها به صورت خودکار انجام می شود(sync on commit).
در ادامه با نحوه ایجاد این نوع از ایندکس، اضافه کردن source به آن و همچنین انجام جستجو از طریق آن آشنا خواهیم شد.
در ابتدا جداول و ویوهایی را ایجاد می کنیم تا بتوانیم از این جداول و ویو به عنوان sourceهای ایندکسی که از طریق DBMS_SEARCH ایجاد می کنیم، استفاده کنیم:
SQL> create table IranTBL1(id number primary key,des varchar2(1000));
Table created.
SQL> insert into IranTBL1 values(1,'www.usefzadeh.com');
1 row created.
SQL> create table IranTBL2(id number primary key,des1 varchar2(1000),des2 CLOB,des3 JSON);
Table created.
SQL> insert into IranTBL2 values(1,'My name i
برچسب: نویسنده: خنجی تاريخ: سه شنبه 30 آبان 1402 ساعت: 1:20
تغییر Execution Plan یک کوئری می تواند به دلایل ساده ای مثل حذف و اضافه کردن ایندکس، پارتیشن بندی جدول، پارتیشن بندی ایندکس اتفاق بیفتد اما شناسایی علت تغییر رفتار Optimizer همیشه ساده نیست چرا که در بعضی از موارد تغییر در Optimizer Environment منجر به ایجاد Execution Plan جدید می شود.
برای مثال در sessionای پارامتر OPTIMIZER_INDEX_COST_ADJ که میزان گرایش Optimizer به استفاده از ایندکس را تعیین می کند، به عدد 1 و در session دیگر این پارامتر به مقدار 1000! تنظیم شده است بدون تردید این تفاوت ها در Optimizer Environment، می تواند Execution Plan بعضی از کوئری ها را تغییر دهد.
موضوع این مستند در مورد آن است که چگونه می توانیم تشخیص دهیم تغییر Execution Plan یک کوئری به دلیل تغییر در Optimizer Environment است؟ و به طور دقیق تر، کدام پارامترها و عوامل محیطی منجر به ایجاد Execution Plan جدید شده اند. این کار را با قابلیت جدیدی که اوراکل در نسخه 23c ارائه کرده است، انجام خواهیم داد.
اوراکل در نسخه های قبل از 23c، در ویوهای V$SQL، V$SQLAREA و DBA_HIST_SQLSTAT در کنار Plan Hash Value مقداری را برای Optimizer-Environment Hash Value نگه می داشت ولی جزییات بیشتری را در مورد این ستون ارائه نمی کرد. اما در نسخه 23c، ویوی DBA_HIST_OPTIMIZER_ENV_DETAILS را ارائه شده است که در این زمینه بسیار راهگشا خواهد بود.
نکته!با استفاده از ویوی v$sys_optimizer_env و v$sql_optimizer_env می توانیم Optimizer Environmentها را ببینیم.
در ادامه قصد داریم از پارامتر OPTIMIZER_INDEX_COST_ADJ برای آشنایی بیشتر با ویوی DBA_HIST_OPTIMIZER_ENV_DETAILS استفاده کنیم.
در ابتدا برای پیش بردن سناریو، جدول و ایندکسی را ای
برچسب: نویسنده: خنجی تاريخ: سه شنبه 30 آبان 1402 ساعت: 1:20
اوراکل در نسخه 21c دیتاتایپ JSON را ارائه کرد و تا قبل از آن، دیتای JSON را می توانستیم در ستونهایی با نوع داده CLOB، BLOB و حتی VARCHAR ذخیره کنیم با این اوصاف اگر دیتابیس را به تازگی به نسخه 21c(و نسخ بالاتر) ارتقا دادیم ممکن است بخواهیم دیتای از نوع JSON را به ستونی که دیتاتایپ آن JSON است منتقل کنیم.
در نسخه 23c، پروسیجری اضافه شده است که می تواند در این فرایند مورد استفاده قرار بگیرد و بعضا بسیار راهگشا باشد. پروسیجر dbms_json.json_type_convertible_check ستونی را به عنوان ورودی می گیرد و بررسی می کند همه فیلدهای آن ستون حاوی دیتای معتبر با فرمت JSON هستند و اگر در این بررسی خطایی رخ دهد این خطا از طریق جدول json_data_precheck قابل مشاهده است.
در ادامه جدولی را ایجاد می کنیم که ستونی از نوع CLOB دارد قرار است دیتای JSON را در این ستون ذخیره کنیم البته محدودیت is json constraint check را برای این ستون تنظیم نمی کنیم تا در هنگام ذخیره کردن اطلاعات، دیتای نامعتبر هم در آن قابل درج باشد.
SQL> create table author_tbl(
2 ID number generated always as identity,
3 author_desc clob
4 );
Table created
SQL> insert into author_tbl(author_desc) values('{"NAME" : "Abbas Hamidian","GENDER" : "m","CURRENT_JOB" : "Oracle DBA"}');
1 row inserted
SQL> insert into author_tbl(author_desc) values('{Ali Fazli}');
1 row inserted
SQL> insert into author_tbl(author_desc) values('usefzadeh.com');
1 row inserted
SQL> commit;
Commit complete
قصد داریم اطلاعات ستون Author_Desc را به ستونی از نوع داده JSON منتقل کنیم(در اوراکل 23c). قبل از جابجایی دیتا، از طریق پروسیجر dbm
برچسب: نویسنده: خنجی تاريخ: سه شنبه 30 آبان 1402 ساعت: 1:20
برچسب: نویسنده: خنجی تاريخ: چهارشنبه 10 آبان 1402 ساعت: 11:11
برچسب: نویسنده: خنجی تاريخ: دوشنبه 1 آبان 1402 ساعت: 19:26